package controller

import (
	"bluebell/logic"
	"bluebell/models"
	"strconv"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// 在此层不要修改数据结构

func CreatePostHandler(c *gin.Context) {
	// 获取参数和参数的校验

	// 获取当前 发帖用户的 ID

	p := new(models.Post)
	uid, _ := GetCurrentUser(c)
	p.AuthorID = int64(uid)
	if err := c.ShouldBindJSON(p); err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}

	if err := logic.CreatePost(p); err != nil {
		zap.L().Error(" logic.CreatePost() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, nil)

	// 创建帖子

	// 返回响应
}

// 根据 ID获取帖子详情
func GetPostHandler(c *gin.Context) {
	// 获取id，校验 id
	idStr := c.Param("id")
	// 字符串解析为数字 10进制
	postID, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}
	// 拿取帖子数据
	data, err := logic.GetPostDetail(postID)
	if err != nil {
		zap.L().Error("logic.GetPostDetail() failed", zap.Error(err))
		ResponseErrorWithMsg(c, CodeSuccess, err.Error())
		return
	}

	// 返回响应
	ResponseSuccess(c, data)

}

// 帖子分页查询
func GetPostListHandler(c *gin.Context) {
	// 校验参数
	pageNumStr := c.Param("offset")
	offset, err := strconv.ParseInt(pageNumStr, 10, 64)

	if err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}
	// 获取数据

	data, err := logic.GetPostList(offset)
	if err != nil {
		zap.L().Error(" logic.GetPostList failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}

	// 返回响应
	zap.L().Debug("成功请求到帖子列表页")
	ResponseSuccess(c, data)

}

func GetPostListHandlerV2(c *gin.Context) {
	// 需要获取前端传来的排序依据
	// 校验参数
	pageNumStr := c.Param("offset")
	// 根据 orderKey 去 redis 获取 帖子 id
	// 根据 post_id 去数据库查询帖子详情

	//c.ShouldBind() 根据请求的数据类型使用对应方法

	// 绑定 url中的 排序参数
	p := new(models.ParamPostList)
	// 注意这里的 shouldbind
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("排序查询参数不可用", zap.Error(err))
		ResponseError(c, CodeInvalidParams)
		return
	}

	offset, err := strconv.ParseInt(pageNumStr, 10, 64)
	if err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}

	// 获取数据 ,order_key

	data, err := logic.GetPostListV2(offset, p)
	if err != nil {
		zap.L().Error(" logic.GetPostList failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
	}

	// 返回响应
	ResponseSuccess(c, data)

}

// 根据社区ID去查询对应的帖子列表
func GetCommunityListHandler(c *gin.Context) {
	// 需要获取前端传来的排序依据
	// 校验参数
	pageNumStr := c.Param("offset")
	// 根据 orderKey 去 redis 获取 帖子 id
	// 根据 post_id 去数据库查询帖子详情

	//c.ShouldBind() 根据请求的数据类型使用对应方法

	// 绑定 url中的 排序参数
	p := new(models.ParamPostListWithCommunity)
	// 注意这里的 shouldbind
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("排序查询参数不可用", zap.Error(err))
		ResponseError(c, CodeInvalidParams)
		return
	}

	offset, err := strconv.ParseInt(pageNumStr, 10, 64)
	if err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}

	// 获取数据 ,order_key

	data, err := logic.GetPostListWithCommunity(offset, p)
	if err != nil {
		zap.L().Error(" logic.GetPostList failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}

	// 返回响应
	ResponseSuccess(c, data)
}
